package com.dyzx.hbb.modules.sys.controller;

import cn.hutool.core.bean.BeanUtil;
import com.dyzx.hbb.common.base.Result;
import com.dyzx.hbb.common.config.MyLambdaQueryWrapper;
import com.dyzx.hbb.common.controller.BaseController;
import com.dyzx.hbb.modules.sys.entity.SysMenu;
import com.dyzx.hbb.modules.sys.service.SysMenuService;
import com.dyzx.hbb.modules.sys.vo.MenuUVO;
import com.dyzx.hbb.modules.sys.vo.MenuVO;
import com.dyzx.hbb.security.context.SecurityContextHolder;
import com.dyzx.hbb.security.model.LoginUser;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 菜单管理控制器
 * 负责处理系统菜单的增删改查、树形结构展示等操作
 */
@RequestMapping("/sys/menu")
@RestController
@Tag(name = "05.菜单管理", description = "菜单相关接口，包括菜单的增删改查、树形结构展示等")
public class MenuController  {

    @Autowired
    private SysMenuService service;



    /**
     * 获取菜单树形列表
     * @return 菜单树形结构列表
     */
    @Operation(summary = "获取菜单树形列表", description = "获取系统所有菜单的树形结构列表")
    @GetMapping("/list")
    public Result<List<Map<String, Object>>> list() {
List<Map<String, Object>> list=service.findByTreeList();
        return Result.ok(list);
    }

    /**
     * 根据ID获取菜单详情
     * @param id 菜单ID
     * @return 菜单详情
     */
    @Operation(summary = "根据ID获取菜单详情", description = "根据菜单ID获取菜单的详细信息")
    @GetMapping("/{id}")
    public Result<Map<String, Object>> getById(
            @Parameter(description = "菜单ID") @PathVariable Long id) {
        MyLambdaQueryWrapper<SysMenu> queryWrapper=new MyLambdaQueryWrapper<>();
        queryWrapper.eq(SysMenu::getId,id);
        queryWrapper.select(SysMenu::getId,SysMenu::getName,SysMenu::getIcon,SysMenu::getRoutePath,SysMenu::getParams,SysMenu::getCompPath,SysMenu::getParentId,SysMenu::getType,SysMenu::getIdx);
      queryWrapper.last("limit 1");
        Map<String, Object> map=service.getMap(queryWrapper);
        return Result.ok(map);
    }

    /**
     * 新增菜单
     * @param entity 菜单信息对象
     * @return 操作结果
     */
    @Operation(summary = "新增菜单", description = "添加新的系统菜单")
    @PostMapping
    public Result<Boolean> add(
            @Parameter(description = "菜单信息对象") @RequestBody MenuVO entity) {
        System.out.println("菜单名称：" + entity);
        SysMenu menu = new SysMenu();
        BeanUtil.copyProperties(entity,menu);
        System.out.println("菜单名称：" );
        System.out.println(menu);
        boolean save = service.save(menu);
        return save?Result.ok():Result.error();
    }

    /**
     * 修改菜单
     * @param entity 菜单更新对象
     * @return 操作结果
     */
    @Operation(summary = "修改菜单", description = "更新已存在的系统菜单信息")
    @PutMapping
    public Result<Boolean> update(
            @Parameter(description = "菜单更新对象") @RequestBody MenuUVO entity) {
        SysMenu menu = new SysMenu();
        BeanUtil.copyProperties(entity,menu);
        boolean update = service.updateById(menu);
        return update?Result.ok():Result.error();
    }
    /**
     * 删除菜单
     * @param id 菜单ID
     * @return 操作结果
     */
    @Operation(summary = "删除菜单", description = "根据ID删除系统菜单")
    @DeleteMapping("/{id}")
    public Result<Boolean> delete(
            @Parameter(description = "菜单ID") @PathVariable Long id) {
        boolean remove = service.removeById(id);
        return remove?Result.ok():Result.error();
    }
    /**
     * 获取菜单简易列表
     * @return 菜单简易列表
     */
    @Operation(summary = "获取菜单简易列表", description = "获取系统菜单的简易列表，包含基本信息")
    @GetMapping("/mini_list")
    public Result<List<Map<String, Object>>> miniList() {
        Long userId = SecurityContextHolder.getUserId();
        Long organId = SecurityContextHolder.getOrganId();
        List<Map<String, Object>> list=service.findByTreeMiniList(organId,userId);
        return Result.ok(list);
    }

    /**
     * 获取菜单路由树形列表
     * @return 菜单路由树形列表
     */
    @Operation(summary = "获取菜单路由树形列表", description = "获取系统菜单的路由树形结构列表，用于前端路由生成")
    @GetMapping("/tree_list")
    public Result<List<Map<String, Object>>> treeList() {
        List<Map<String, Object>> list=service.findByTreeRouterList();
        return Result.ok(list);
    }


    /**
     * 获取菜单权限标识列表
     * @return 菜单权限标识列表
     */
    @Operation(summary = "获取菜单权限标识列表", description = "获取当前用户拥有的菜单权限标识列表")
    @GetMapping("/key_list")
    public Result<List<String>> keyList() {
        LoginUser loginUser = SecurityContextHolder.getLoginUser();
        List<String> permissions = loginUser.getPermissions();
        return Result.ok(permissions);
    }
}
